跳到主要内容

Kustomize With Helm

Helm Chart 模板变量的值通过 Values 文件来控制,我们无法修改未公开的值,若需要进行自定义通常要 fork 上游的 Helm Chart 仓库,然后进行改动,这样做会带来额外的负担。这时候我们可以使用 Kustomize 在 patches 阶段使用标准 Kustomize 补丁覆盖 Helm Chart 中 hardcoded 部分的值。

kustomize 提供了两种方法:

  • helmCharts 内置字段
  • HelmChartInflationGenerator 插件

helmCharts

这是 Kustomize 的内置功能,允许用户在 kustomization.yaml 文件中直接定义 Helm chart 的配置。这种方式简单直接,易于理解,适合于需要对 Helm chart 进行简单配置,且不需要复杂自定义行为的场景。

apiVersion: kustomize.config.k8s.io/v1bata1
kind: Kustomization
helmCharts:
- name: example
releaseName: my-example
version: "1.2.3" # 可选,指定 chart 版本
repo: https://charts.example.com/ # 可选,指定 chart 仓库
valuesMerge: override
valuesFile: base-values.yaml # 基础 values 文件
# Inline
valuesInline:
key1: value1
key2: value2
# Values files:
valuesFile: values.yaml
additionalValuesFiles:
- values-file-1.yml
- values-file-2.yml

实践案例1


这是我用于 grafana-agent 的一个示例
假设您的基础文件夹values.yaml位于基础文件夹中,其中包含所有所需的默认值。
base/values.yaml

agent:
resources:
requests:
cpu: "150m"
memory: "256Mi"
limits:
cpu: "200m"
memory: "1Gi"
overlays/dev/kustomization.yaml

helmCharts:
- name: grafana-agent
version: 0.27.2
repo: https://grafana.github.io/helm-charts
releaseName: grafana-agent
namespace: grafana
includeCRDs: false
valuesFile: ../../base/values.yaml
valuesMerge: override # how to treat valuesInline with respect to Values. Legal values: ‘merge’, ‘override’, ‘replace’. Defaults to ‘override’.
valuesInline:
agent:
resources:
requests:
# cpu: "150m" # Will inherit from base
memory: "2Gi" # Will override
limits:
# cpu: "200m" # Will inherit from base
memory: "3Gi" # Will override


现在您可以构建,但请确保禁用负载限制器

kustomize build --enable-helm --load-restrictor=LoadRestrictionsNone > manifests.yaml

additionalValuesFiles??

HelmChartInflationGenerator

HelmChartInflationGenerator是一个Kustomize的生成器插件,用于从Helm chart生成Kubernetes资源。这个插件通过解析helmCharts字段中的配置来工作。

步骤 1: 创建base配置

---
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1
kind: Kustomization
generators:
- helmchart.yaml
---
# base/helmchart.yaml
apiVersion: kustomize.config.k8s.io/v1
kind: HelmChartInflationGenerator
metadata:
name: mychart
helmCharts:
- name: mychart
releaseName: my-release
repo: https://example.com/charts
version: 1.0.0
namespace: default
valuesFile: values.yaml
---
# base/values.yaml
replicaCount: 2
service:
type: ClusterIP

步骤 2: 创建 overlay 配置

---
# overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1
kind: Kustomization
generators:
- helmchart.yaml
resources:
- ../../base
---
# overlays/prod/prod-values.yaml
replicaCount: 5
service:
type: LoadBalancer
---
# overlays/prod/helmchart.yaml
apiVersion: kustomize.config.k8s.io/v1
kind: HelmChartInflationGenerator
metadata:
name: mychart
helmCharts:
- name: mychart
releaseName: my-production-release
repo: https://example.com/charts
version: 1.0.0
namespace: prod
valuesFile: prod-values.yaml

步骤 3: 应用配置 在你的命令行中,切换到 overlays/prod 目录并运行:kustomize build .

参考

讨论

例子